home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 September / Chip_2002-09_cd1.bin / sharewar / slunec / app / httrack.exe / {app} / src_win / WinHTTrack / splitter.cpp < prev    next >
C/C++ Source or Header  |  2002-06-24  |  14KB  |  460 lines

  1. // splitter.cpp : implementation file
  2. //
  3.  
  4. #include "resource.h"
  5. #include "stdafx.h"
  6. #include "splitter.h"
  7. #include "DialogContainer.h"
  8. #include "cpp_lang.h"
  9.  
  10. #include "afxpriv.h"
  11.  
  12. // CDirTreeView
  13. #include "DirTreeView.h"
  14.  
  15. // Pointeur sur nous
  16. #include "WinHTTrack.h"
  17. extern CWinHTTrackApp* this_app;
  18.  
  19. #ifdef _DEBUG
  20. #undef THIS_FILE
  21. static char BASED_CODE THIS_FILE[] = __FILE__;
  22. #endif
  23.  
  24. static UINT indicators[] =
  25. {
  26.     ID_SEPARATOR,           // status line indicator
  27.     ID_INDICATOR_CAPS,
  28.     ID_INDICATOR_NUM,
  29.     ID_INDICATOR_SCRL,
  30. };
  31.  
  32. // splitter frame
  33. extern CSplitterFrame* this_CSplitterFrame;
  34. // termine flag
  35. extern int termine;
  36.  
  37. /* DirTreeView */
  38. #include "DirTreeView.h"
  39. extern CDirTreeView* this_DirTreeView;
  40.  
  41.  
  42.  
  43. /////////////////////////////////////////////////////////////////////////////
  44. // CSplitterFrame
  45.  
  46. // Create a splitter window which splits an output text view and an input view
  47. //                           |
  48. //    TEXT VIEW (CTextView)  | INPUT VIEW (CInputView)
  49. //                           |
  50.  
  51. IMPLEMENT_DYNCREATE(CSplitterFrame, CMDIChildWnd)
  52.  
  53. CSplitterFrame::CSplitterFrame()
  54. {
  55.   this_CSplitterFrame=this;
  56. }
  57.  
  58. CSplitterFrame::~CSplitterFrame()
  59. {
  60.   this_CSplitterFrame=NULL;
  61. }
  62.  
  63. #define wm_IcnRest (WM_USER + 16)
  64. BEGIN_MESSAGE_MAP(CSplitterFrame, CMDIChildWnd)
  65.     //{{AFX_MSG_MAP(CSplitterFrame)
  66.     ON_WM_MDIACTIVATE()
  67.     ON_WM_CLOSE()
  68.     //}}AFX_MSG_MAP
  69.   ON_MESSAGE( wm_IcnRest, IconRestore )
  70. END_MESSAGE_MAP()
  71. //
  72.  
  73. // Iconify
  74. void CSplitterFrame::Onhide() 
  75. {
  76.   if (!iconifie) {
  77.     //icnd.hWnd=this->GetMainWnd()->m_hWnd;
  78.     //icnd.hWnd=AfxGetMainWnd()->m_hWnd;
  79.     icnd.hWnd=this_CSplitterFrame->m_hWnd;
  80.     strcpy(icnd.szTip,"WinHTTrack Website Copier");
  81.     /* */
  82.     AfxGetMainWnd()->ShowWindow(SW_HIDE);
  83.     //ShowWindow(SW_SHOWMINNOACTIVE);
  84.     Shell_NotifyIcon(NIM_ADD,&icnd);
  85.     iconifie=true;
  86.   } else {
  87.     CheckRestore();
  88.   }
  89. }
  90.  
  91. LRESULT CSplitterFrame::IconRestore(WPARAM wParam,LPARAM lParam) {
  92.   if (iconifie) {
  93.     POINT point;
  94.     GetCursorPos(&point);
  95.     //ScreenToClient(&point);
  96.     int msg=(UINT) lParam;
  97.     if (msg==WM_RBUTTONDOWN) {  // menu      
  98.       CMenu menu;
  99.       VERIFY(menu.LoadMenu(IDR_POPUP));
  100.       CMenu* pPopup = menu.GetSubMenu(0);
  101.       ASSERT(pPopup != NULL); 
  102.       pPopup->TrackPopupMenu(TPM_RIGHTBUTTON,
  103.         point.x, point.y, AfxGetMainWnd());
  104.     } else if (msg==WM_LBUTTONDBLCLK) {
  105.       CheckRestore();
  106.     }
  107.   }
  108.   return 0;
  109. }
  110.  
  111. void CSplitterFrame::IconChange(CString st) {
  112.   if (iconifie) {
  113.     strcpy(icnd.szTip,"");
  114.     strncat(icnd.szTip,st,60);
  115.     Shell_NotifyIcon(NIM_MODIFY,&icnd);
  116.   }
  117. }
  118.  
  119. void CSplitterFrame::CheckRestore() {
  120.   if (iconifie) {
  121.     Shell_NotifyIcon(NIM_DELETE,&icnd);
  122.     //if (!termine) {
  123.     if (AfxGetMainWnd()) {
  124.       if (AfxGetMainWnd()->m_hWnd) {
  125.         AfxGetMainWnd()->ShowWindow(SW_RESTORE);
  126.         AfxGetMainWnd()->SetForegroundWindow();
  127.       }
  128.     }
  129.     iconifie=false;
  130.   }
  131. }
  132. // FIN Iconify
  133.  
  134.  
  135. BOOL CSplitterFrame::Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle , const RECT& rect , CMDIFrameWnd* pParentWnd , CCreateContext* pContext ) {
  136.   /* recrΘer control tabs */
  137.   this_app->NewTabs();
  138.  
  139.   // Enlever bordure fenΩtre, et mettre en plein Θcran (pas de fenΩtre dans la fenΩtre!!)
  140.   dwStyle&=(~(WS_MINIMIZEBOX|WS_BORDER|WS_CAPTION|WS_OVERLAPPED|WS_OVERLAPPEDWINDOW));
  141.   dwStyle|=(WS_MAXIMIZE);
  142.   int r=CMDIChildWnd::Create(lpszClassName,lpszWindowName,dwStyle ,rect ,pParentWnd ,pContext );
  143.   if (r) {
  144.     // Mettre en maximisΘ
  145.     WINDOWPLACEMENT pl;
  146.     RECT rc;
  147.     rc.top=0;
  148.     rc.left=0;
  149.     rc.bottom=200;
  150.     rc.right=400;
  151.     pl.length=sizeof(pl);
  152.     pl.flags=WPF_RESTORETOMAXIMIZED;
  153.     pl.showCmd=SW_SHOWMAXIMIZED;
  154.     pl.rcNormalPosition=rc;
  155.     SetWindowPlacement(&pl);
  156.   }
  157.  
  158.   // iconification
  159.   iconifie=false;
  160.   icnd.cbSize=sizeof(NOTIFYICONDATA);
  161.   icnd.uID=0;              // euhh id=0
  162.   icnd.uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;
  163.   icnd.uCallbackMessage=wm_IcnRest;  // notre callback
  164.   icnd.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  165.  
  166.   // Retourner rΘsultat
  167.   return r;
  168. }
  169.  
  170. static TCHAR BASED_CODE szSection[] = _T("Settings");
  171. static TCHAR BASED_CODE szWindowPos[] = _T("SplitterPos");
  172. BOOL CSplitterFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext) 
  173. {
  174.   /*
  175.     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  176.         | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  177.         !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  178.     {
  179.         TRACE0("Failed to create toolbar\n");
  180.         return -1;      // fail to create
  181.     }
  182.  
  183.     if (!m_wndStatusBar.Create(this) ||
  184.         !m_wndStatusBar.SetIndicators(indicators,
  185.           sizeof(indicators)/sizeof(UINT)))
  186.     {
  187.         TRACE0("Failed to create status bar\n");
  188.         return -1;      // fail to create
  189.     }
  190.     // TODO: Delete these three lines if you don't want the toolbar to
  191.     //  be dockable
  192.     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  193.     EnableDocking(CBRS_ALIGN_ANY);
  194.     DockControlBar(&m_wndToolBar);
  195.   */
  196.   //
  197.  
  198.     // create a splitter with 1 row, 2 columns
  199.     if (!m_wndSplitter.CreateStatic(this, 1, 2))
  200.     {
  201.         TRACE0("Failed to CreateStaticSplitter\n");
  202.         return FALSE;
  203.     }
  204.  
  205.     // add the first splitter pane - the default view in column 0
  206.     /*if (!m_wndSplitter.CreateView(0, 0,
  207.         pContext->m_pNewViewClass, CSize(130, 50), pContext))
  208.     {
  209.         TRACE0("Failed to create first pane\n");
  210.         return FALSE;
  211.     }*/
  212.  
  213.   int PaneW=200,PaneH=50;
  214.   {
  215.     CString strBuffer = AfxGetApp()->GetProfileString(szSection, szWindowPos);
  216.     if (!strBuffer.IsEmpty()) {
  217.       int rx=0,ry=0;
  218.       if (sscanf(strBuffer,"%d,%d",&rx,&ry)==2) {
  219.         PaneW=rx;
  220.         PaneH=ry;
  221.       }
  222.     }
  223.   }
  224.  
  225.     // add the second splitter pane - an input view in column 1
  226.  
  227.     if (!m_wndSplitter.CreateView(0, 0,
  228.         RUNTIME_CLASS(CDirTreeView), CSize(PaneW, PaneH), pContext))
  229.     {
  230.         TRACE0("Failed to create second pane\n");
  231.         return FALSE;
  232.     }
  233.   if (this_DirTreeView)
  234.     this_DirTreeView->docType=".whtt";
  235.  
  236.     // add the second splitter pane - an input view in column 1
  237.     if (!m_wndSplitter.CreateView(0, 1,
  238.         RUNTIME_CLASS(CDialogContainer), CSize(0,0), pContext))
  239.     {
  240.         TRACE0("Failed to create second pane\n");
  241.         return FALSE;
  242.     }
  243.  
  244.   //m_wndSplitter.SetColumnInfo(1,800,400);
  245.  
  246.   // menu entries - done with MDIactivate
  247.   //SetMenuPrefs();
  248.  
  249.   // activate the input view
  250.     SetActiveView((CView*)m_wndSplitter.GetPane(0,1));
  251.  
  252.     return TRUE;
  253. }
  254.  
  255. CSplitterWnd* CSplitterFrame::GetSplitter() {
  256.   return &m_wndSplitter;
  257. }
  258.  
  259. BOOL CSplitterFrame::SetNewView(int row, int col, CRuntimeClass* pViewClass) {
  260.   ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));
  261.   
  262.   CView* pView = STATIC_DOWNCAST(CView, m_wndSplitter.GetPane(row, col));
  263.   CFrameWnd* pFrame = pView->GetParentFrame();
  264.   ASSERT(pFrame);
  265.   
  266.   // set up create context to preserve doc/frame etc.
  267.   CCreateContext cc;
  268.   memset(&cc, sizeof(cc), 0);
  269.   cc.m_pNewViewClass = pViewClass;
  270.   cc.m_pCurrentDoc = pView->GetDocument();
  271.   cc.m_pNewDocTemplate = cc.m_pCurrentDoc ?
  272.     cc.m_pCurrentDoc->GetDocTemplate() : NULL;
  273.   cc.m_pCurrentFrame = pFrame;
  274.   
  275.   m_wndSplitter.DeleteView(row, col);                // delete old view
  276.  
  277.   /* */
  278.   /* recrΘer control tabs */
  279.   this_app->NewTabs();
  280.   /* */
  281.  
  282.   VERIFY(m_wndSplitter.CreateView(row, col,          // create new one
  283.     pViewClass,
  284.     CSize(0,0),                      // will fix in RecalcLayout
  285.     &cc));
  286.   
  287.   m_wndSplitter.RecalcLayout();                      // recompute layout 
  288.   
  289.   // initialize the view
  290.   CWnd* pWnd = m_wndSplitter.GetPane(row, col);
  291.   if (pWnd)
  292.     pWnd->SendMessage(WM_INITIALUPDATE);
  293.  
  294.   GetActiveDocument()->SetModifiedFlag(FALSE);      // Document vide
  295.   GetActiveDocument()->SetTitle("New Project");
  296.   //SetDefaultTitle(GetActiveDocument());
  297.   return 1;
  298. }
  299.  
  300. BOOL CSplitterFrame::SetSaved() {
  301.   GetActiveDocument()->SetModifiedFlag(FALSE);      // Document sauvΘ
  302.   return 1;
  303. }
  304.  
  305. // Nommer le document
  306. BOOL CSplitterFrame::SetNewName(CString name) {
  307.   GetActiveDocument()->SetPathName(name);
  308.   int pos=max(name.ReverseFind('\\'),name.ReverseFind('/'))+1;
  309.   GetActiveDocument()->SetTitle(name.Mid(pos));
  310.   GetActiveDocument()->SetModifiedFlag();
  311.   return 1;
  312. }
  313.  
  314. void CSplitterFrame::EnableExtEntries(BOOL state) {
  315.   CMenu* menu = GetParent()->GetParent()->GetMenu();
  316.   if (menu) {
  317.     int status;
  318.     if (!state)
  319.       status=MF_GRAYED; 
  320.     else
  321.       status=MF_ENABLED; 
  322.     menu->EnableMenuItem(2,status|MF_BYPOSITION);
  323.     menu->EnableMenuItem(3,status|MF_BYPOSITION);
  324.     
  325.     GetParent()->GetParent()->DrawMenuBar();
  326.   }
  327. }
  328.  
  329. void CSplitterFrame::EnableSaveEntries(BOOL state) {
  330.   CMenu* menu = GetParent()->GetParent()->GetMenu();
  331.   if (menu) {
  332.     int status;
  333.     if (!state)
  334.       status=MF_GRAYED; 
  335.     else
  336.       status=MF_ENABLED; 
  337.     menu->EnableMenuItem(1,status|MF_BYPOSITION);
  338.     menu->EnableMenuItem(1,status|MF_BYPOSITION);
  339.     GetParent()->GetParent()->DrawMenuBar();
  340.   }
  341. }
  342.  
  343. void CSplitterFrame::SetMenuPrefs() {
  344.   if (LANG_T(-1)) {    // Patcher en franτais
  345.     CMenu* menu = GetParent()->GetParent()->GetMenu();
  346.     if (menu) {
  347.       menu->ModifyMenu(0,MF_BYPOSITION,0,LANG(LANG_P1));
  348.       menu->ModifyMenu(1,MF_BYPOSITION,1,LANG(LANG_P2));
  349.       menu->ModifyMenu(2,MF_BYPOSITION,2,LANG(LANG_P3));
  350.       menu->ModifyMenu(3,MF_BYPOSITION,0,LANG(LANG_P4));
  351.       menu->ModifyMenu(4,MF_BYPOSITION,1,LANG(LANG_P5));
  352.       menu->ModifyMenu(5,MF_BYPOSITION,2,LANG(LANG_P6));
  353.       //
  354.       menu->ModifyMenu(ID_FILE_NEW ,MF_BYCOMMAND,ID_FILE_NEW,LANG_P18);
  355.       menu->ModifyMenu(ID_FILE_OPEN ,MF_BYCOMMAND,ID_FILE_OPEN,LANG_P19);
  356.       menu->ModifyMenu(ID_FILE_SAVE ,MF_BYCOMMAND,ID_FILE_SAVE,LANG_P20);
  357.       menu->ModifyMenu(ID_FILE_SAVE_AS ,MF_BYCOMMAND,ID_FILE_SAVE_AS,LANG_P21);
  358.       menu->ModifyMenu(ID_FILE_DELETE_PROJ ,MF_BYCOMMAND,ID_FILE_DELETE_PROJ,LANG_P22);
  359.       menu->ModifyMenu(ID_FILE_BROWSE_SIT ,MF_BYCOMMAND,ID_FILE_BROWSE_SIT,LANG_P23);
  360.       menu->ModifyMenu(ID_APP_EXIT,MF_BYCOMMAND,ID_APP_EXIT,LANG(LANG_P10));
  361.       menu->ModifyMenu(ID_LoadDefaultOptions,MF_BYCOMMAND,ID_LoadDefaultOptions,LANG(LANG_P11));
  362.       menu->ModifyMenu(ID_SaveProject,MF_BYCOMMAND,ID_SaveProject,LANG_SAVEPROJECT);
  363.       menu->ModifyMenu(ID_NewProjectImport,MF_BYCOMMAND,ID_NewProjectImport,LANG(LANG_P18));
  364.       menu->ModifyMenu(ID_SaveDefaultOptions,MF_BYCOMMAND,ID_SaveDefaultOptions,LANG(LANG_P12));
  365.       menu->ModifyMenu(ID_ClearDefaultOptions,MF_BYCOMMAND,ID_ClearDefaultOptions,LANG(LANG_P12b));
  366.       menu->ModifyMenu(ID_LOAD_OPTIONS,MF_BYCOMMAND,ID_FILE_OPEN,LANG(LANG_P13));
  367.       menu->ModifyMenu(ID_FILE_SAVE_OPTIONS_AS,MF_BYCOMMAND,ID_FILE_SAVE_AS,LANG(LANG_P14));
  368.       menu->ModifyMenu(IDC_langprefs,MF_BYCOMMAND,IDC_langprefs,LANG(LANG_P15));
  369.       menu->ModifyMenu(ID_HELP,MF_BYCOMMAND,ID_HELP,LANG(LANG_P16));
  370.       menu->ModifyMenu(IDC_ipabout,MF_BYCOMMAND,IDC_ipabout,LANG(LANG_P17));
  371.       //
  372.       /*
  373.       menu->ModifyMenu(0,MF_BYPOSITION,0,LANG(LANG_O1));
  374.       menu->ModifyMenu(1,MF_BYPOSITION,1,LANG(LANG_O2));
  375.       menu->ModifyMenu(2,MF_BYPOSITION,2,LANG(LANG_O3));
  376.       menu->ModifyMenu(3,MF_BYPOSITION,3,LANG(LANG_O4));
  377.       menu->ModifyMenu(4,MF_BYPOSITION,4,LANG(LANG_O5));
  378.       */
  379.       //
  380.       menu->ModifyMenu(ID_FILE_PAUSE,MF_BYCOMMAND,ID_FILE_PAUSE,LANG(LANG_O10));
  381.       menu->ModifyMenu(ID_FILE_EXIT,MF_BYCOMMAND,ID_FILE_EXIT,LANG(LANG_O11));
  382.       menu->ModifyMenu(ID_OPTIONS_MODIFY,MF_BYCOMMAND,ID_OPTIONS_MODIFY,LANG(LANG_O12));
  383.       menu->ModifyMenu(ID_LOG_VIEWLOG,MF_BYCOMMAND,ID_LOG_VIEWLOG,LANG(LANG_O13));
  384.       menu->ModifyMenu(ID_LOG_VIEWERRORLOG,MF_BYCOMMAND,ID_LOG_VIEWERRORLOG,LANG(LANG_O14));
  385.       menu->ModifyMenu(ID_LOG_VIEWTRANSFERS,MF_BYCOMMAND,ID_LOG_VIEWTRANSFERS,LANG(LANG_O14b));
  386.       menu->ModifyMenu(ID_WINDOW_HIDE,MF_BYCOMMAND,ID_WINDOW_HIDE,LANG(LANG_O15));
  387.       //menu->ModifyMenu(ID_VIEW_TOOLBAR,MF_BYCOMMAND,ID_VIEW_TOOLBAR,LANG(LANG_O18));
  388.       menu->ModifyMenu(ID_VIEW_STATUS_BAR,MF_BYCOMMAND,ID_VIEW_STATUS_BAR,LANG(LANG_O19));
  389.       menu->ModifyMenu(ID_WINDOW_SPLIT,MF_BYCOMMAND,ID_WINDOW_SPLIT,LANG(LANG_O20));      
  390.       menu->ModifyMenu(ID_ABOUT,MF_BYCOMMAND,ID_ABOUT,LANG(LANG_O16));
  391.       menu->ModifyMenu(ID_UPDATE,MF_BYCOMMAND,ID_UPDATE,LANG(LANG_O17));
  392.       //
  393.       GetParent()->GetParent()->DrawMenuBar();
  394.     }
  395.   }
  396. }
  397.  
  398.  
  399. /////////////////////////////////////////////////////////////////////////////
  400. //
  401.  
  402. IMPLEMENT_DYNAMIC(CViewExSplitWnd, CSplitterWnd)
  403.  
  404. CViewExSplitWnd::CViewExSplitWnd()
  405. {
  406. }
  407.  
  408. CViewExSplitWnd::~CViewExSplitWnd()
  409. {
  410. }
  411.  
  412. CWnd* CViewExSplitWnd::GetActivePane(int* pRow, int* pCol)
  413. {
  414.     ASSERT_VALID(this);
  415.  
  416.     // attempt to use active view of frame window
  417.     CWnd* pView = NULL;
  418.     CFrameWnd* pFrameWnd = GetParentFrame();
  419.     ASSERT_VALID(pFrameWnd);
  420.     pView = pFrameWnd->GetActiveView();
  421.  
  422.     // failing that, use the current focus
  423.     if (pView == NULL)
  424.         pView = GetFocus();
  425.  
  426.     return pView;
  427. }
  428.  
  429. //
  430.  
  431. /* Activation du MDI */
  432. void CSplitterFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd) 
  433. {
  434.     CMDIChildWnd::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);
  435.   SetMenuPrefs();
  436.   /* disable ext. entries by default */
  437.   this_CSplitterFrame->EnableExtEntries(FALSE);
  438.   this_CSplitterFrame->EnableSaveEntries(TRUE);
  439.  
  440.   if (!bActivate) {
  441.     int cxCur,cxMin;
  442.     TCHAR szBuffer[sizeof("-32767")*8];
  443.     m_wndSplitter.GetColumnInfo(0,cxCur,cxMin);
  444.     sprintf(szBuffer,"%d,%d",cxCur,cxMin);
  445.       AfxGetApp()->WriteProfileString(szSection, szWindowPos, szBuffer);
  446.   }
  447. }
  448.  
  449.  
  450. void CSplitterFrame::OnClose() 
  451. {
  452.   int cxCur,cxMin;
  453.   TCHAR szBuffer[sizeof("-32767")*8];
  454.   m_wndSplitter.GetColumnInfo(0,cxCur,cxMin);
  455.   sprintf(szBuffer,"%d,%d",cxCur,cxMin);
  456.     AfxGetApp()->WriteProfileString(szSection, szWindowPos, szBuffer);
  457.  
  458.     CMDIChildWnd::OnClose();
  459. }
  460.